/**
 * 给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。
 * 如果存在一个整数 x 使得 n == 2x ，则认为 n 是 2 的幂次方。
 */

using namespace std;


/**
 * 方法1：位运算
 * 对于2的幂n，二进制表示为10000……(第一位为1，后面为0)
 * 将其与n-1(01111……)进行与&运算可得0（当且仅当n&n-1为0）
 */
class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n>0 && (n&(n-1)) == 0;
    }
};


/**
 * 方法2：位运算
 * 由于负数是按照补码规则在计算机中存储的，-n 的二进制表示为 n 的二进制表示的每一位取反再加上 1
 * 如果 n 是正整数并且n & (-n) = n，那么 n就是 2的幂。
 */
class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n > 0 && (n & -n) == n;
    }
};


/**
 * 方法3：判断是否为最大 2 的幂的约数
 * 在题目给定的 3232 位有符号整数的范围内，最大的 22 的幂为 2^30 = 10737418242。
 * 我们只需要判断 n 是否是 2^30的约数即可。
 */
class Solution {
private:
    static constexpr int BIG = 1 << 30;

public:
    bool isPowerOfTwo(int n) {
        return n > 0 && BIG % n == 0;
    }
};